小编kie*_*tos的帖子

当返回2xx以外的代码时,如何使用HttpURLConnection获取响应体?

如果服务器返回错误,我在检索Json响应时遇到问题.详情见下文.

我如何执行请求

我用java.net.HttpURLConnection.我设置了请求属性,然后我做:

conn = (HttpURLConnection) url.openConnection();
Run Code Online (Sandbox Code Playgroud)

在那之后,当请求成功时,我得到了Json的回复:

br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
sb = new StringBuilder();
String output;
while ((output = br.readLine()) != null) {
  sb.append(output);
}
return sb.toString();
Run Code Online (Sandbox Code Playgroud)

......问题是:

当服务器返回50x或40x之类的错误时,我无法检索收到的Json.以下行抛出IOException:

br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
// throws java.io.IOException: Server returned HTTP response code: 401 for URL: www.example.com
Run Code Online (Sandbox Code Playgroud)

服务器确定发送正文,我在外部工具Burp Suite中看到它:

HTTP/1.1 401 Unauthorized

{"type":"AuthApiException","message":"AuthApiException","errors":[{"field":"email","message":"Invalid username and/or password."}]}
Run Code Online (Sandbox Code Playgroud)

我可以使用以下方法获得响应消息(即"内部服务器错误")和代码(即"500"):

conn.getResponseMessage();
conn.getResponseCode();
Run Code Online (Sandbox Code Playgroud)

但我无法检索请求正文...也许有一些方法我没有在库中注意到?

java http httpurlconnection

84
推荐指数
3
解决办法
9万
查看次数

如何管理多个JSON模式文件?

我正在尝试使用commonjs-utils中的node.js + json-schema.js来验证我的JSON API.只需单个验证就很容易,但无法找到正确的方法来管理多个模式文件以实现相互引用.

假设我有两个模型和两个API.

// book
{
  "type": "object",
  "properties": {
      "title": { "type": "string" },
      "author": { "type": "string" }
  }
}
// author
{
  "type": "object",
  "properties": {
      "first_name": { "type": "string" },
      "last_name": { "type": "string" }
  }
}  
// authors API
{
  "type": "array",
  "items": { "$ref": "author" }
}
// books API: list of books written by same author
{
  "type": "object",
  "properties": {
    "author": { "$ref": "author" } 
    "books": { "type": "array", "items": …
Run Code Online (Sandbox Code Playgroud)

schema json jsonschema node.js

34
推荐指数
1
解决办法
2万
查看次数

Appium v​​s Espresso用于自动化测试框架

在过去的几周里,我正在使用Appium(python)Android进行测试,但昨天我们决定转向Expresso(Java)进行自动化测试.我们为什么要做这个转变有几个原因:

  • 我们希望扩展自动化测试,并且appium中没有很多功能.

  • 这是Android的最新测试框架之一,具有良好的向后兼容性.

  • 小API,非常容易定制.

我一直在阅读浓缩咖啡,但我找不到任何好的东西,如果我将它与Appium进行比较.我是一个Python/R developer也许有几点我无法理解.有谁愿意帮助我了解这个新测试框架的转变是否对未来有利?我错过了这里更大的图片,任何帮助将不胜感激.

java android automated-tests appium android-espresso

17
推荐指数
4
解决办法
1万
查看次数

如何查看我使用的合并工具?

我想检查我的git设置的合并工具 - 我只是不记得名字.我知道我可以等到下一个合并机会来运行它git merge tool并查看它是什么,但我想输入类似于git mergetool status查看工具的内容(例如,版本是什么).

git mergetool

9
推荐指数
2
解决办法
5763
查看次数

通过appium java脚本为Next Testcase重新打开应用程序

我成功运行appium java脚本.但问题是,我的应用程序以登录页面开始.登录后,我可以自动化一些测试用例.但我想再次从登录页面通过脚本来运行下一个测试用例..如何关闭应用程序以及后台模式并重新打开应用程序而无需再次重新安装应用程序?因为测试用例不应该相互依赖

public class AppTest {

    private static RemoteWebDriver driver;

    @BeforeClass
    public static void initSimulator() throws MalformedURLException
    {
            DesiredCapabilities capabilities = new DesiredCapabilities();

            capabilities.setCapability("platformName", "Android");            
            capabilities.setCapability("platformVersion", "5.0.1");           
            capabilities.setCapability("deviceName", "emulator-5554");                
            capabilities.setCapability("app", "D:\\adt-bundle-windows-x86_64-20140702\\sdk\\platform-tools\\Yr.apk");    
            capabilities.setCapability("app-package", "com.you.android");                   
            capabilities.setCapability("app-activity", "com.yr.sts.SplashActivity");                  
            capabilities.setCapability("app_wait_activity",".MainActivity");

            driver = new RemoteWebDriver(new URL("http://127.0.0.1:4723/wd/hub"),
                capabilities);

            System.out.println("App Launched");
    }
    @AfterClass
    public static void quitDriver() 
    {
       driver.quit();
       System.out.println("Driver has been Quit");
    }

    @Test
    public void sign_in_Click() throws InterruptedException 
    {
        WebElement sign_button = driver.findElement(By.name("Sign-in"));
        sign_button.click();
        WebElement usr = driver.findElement(By.id("com.you.android:id/et_login_email_or_mobile"));
        usr.sendKeys("hello1@gmail.com");
        Thread.sleep(2000);
        WebElement passwrd = driver.findElement(By.id("com.you.android:id/et_login_pwd"));
        passwrd.sendKeys("123456789"); …
Run Code Online (Sandbox Code Playgroud)

junit android appium

7
推荐指数
1
解决办法
1217
查看次数

使用BeanUtils或类似方法将非null属性从一个对象复制到另一个对象

我的目标是将一个对象的字段复制到另一个对象中,但只复制那些非空的对象.我不想明确指定它.更通用的解决方案非常有用且易于维护,即在REST API中实现PATCH,您只允许提供特定字段.

我看到了这个类似的线程,我正在尝试从这里实现一些想法:Helper,以便将非null属性从对象复制到另一个?(JAVA)

但是程序执行后对象不会以任何方式改变.

所以这是我创建的示例类,例如:

class Person {
    String name;
    int age;
    Pet friend;

    public Person() {
    }

    public Person(String name, int age, Pet friend) {
        this.name = name;
        this.age = age;
        this.friend = friend;
    }

    // getters and setters here
}

class Pet {
    String name;
    int age;

    public Pet(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // getters and setters here
}
Run Code Online (Sandbox Code Playgroud)

这是我重写的copyProperty方法:

import org.apache.commons.beanutils.BeanUtilsBean;
import java.lang.reflect.InvocationTargetException;

public class MyBeansUtil extends BeanUtilsBean { …
Run Code Online (Sandbox Code Playgroud)

java spring javabeans

7
推荐指数
3
解决办法
1万
查看次数

Spring,JPA - 双向@OneToMany:用另一个替换子列表

我阅读了很多这方面的主题并进行了数百次实验,但到目前为止还没有成功。我有以下课程:

class Parent {
    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL/*, orphanRemoval=true*/)
    private List<Child> children = new ArrayList<>();

class Child {
    @ManyToOne(cascade = {CascadeType.ALL})
    @JoinColumn(name = "parentId", nullable = false)
    @JsonIgnore
    Parent parent;
}
Run Code Online (Sandbox Code Playgroud)

我所做的就是尝试将children列表替换为 PATCH 请求中提供的列表:

    Hibernate.initialize(fromDb.getChildren());
    entityManager.detach(fromDb); // detach from JPA. I need this

    List<Child> newChildren = fromClient.getChildren();

    fromDb.getChildren().clear(); // get rid of all old elements

    for (Child child : newChildren) { // add the new ones
        child.setParent(fromDb);
        fromDb.getChildren().add(child);
    }

    ParentRepository.save(merged);
Run Code Online (Sandbox Code Playgroud)

行为如下:

  • 当我按原样运行它时,它会添加新的,但留下旧的!所以我不想要的孩子越来越多(抱歉..)
  • 当我取消注释orphanRemoval=true …

spring jpa spring-boot

6
推荐指数
1
解决办法
3312
查看次数

GWT会话管理

我对java上的gwt会话并不太了解.我对它有些怀疑.任何人都可以检查下面的实现是否需要完成.

public class ServiceImpl extends RemoteServiceServlet implements Service  
{
   void CreateSession(String Username)
   {
      HttpServletRequest request = this.getThreadLocalRequest();
      HttpSession session = request.getSession();
      session.setAttribute("Username", Username);
   }

   boolean ValidateSession(String Username)
   {
       HttpServletRequest request = this.getThreadLocalRequest();
       HttpSession session = request.getSession();
       if (session.getAttribute("Username"))
       {
          return true;
       }
       return false;
   }
}
Run Code Online (Sandbox Code Playgroud)

这是实现这两个功能的正确方法吗?

java session gwt servlets session-management

5
推荐指数
2
解决办法
1万
查看次数

将 ISO 8601 时间戳字符串转换为 java.time.OffsetDateTime

假设我有一个 ISO 8601 格式的日期:"2017-01-10T14:55:32+01:00"

如何将其转换为OffsetDateTime

我在这里没有找到任何答案。我尝试了以下操作:

public OffsetDateTime stringToOffsetDateTime() {
        return OffsetDateTime.from(Instant.parse("2019-12-12T10:39:40-02:00"));
    }
Run Code Online (Sandbox Code Playgroud)

但它抛出DateTimeParseException.

java iso8601 java-8

3
推荐指数
1
解决办法
8457
查看次数

由于 SecurityException: Permission Denial,无法通过 adb 或 Appium 运行 Android 应用程序

我尝试对 Android 应用程序进行测试自动化。我有来自开发人员的活动名称和包名称,所以它是正确的。我在访问活动时遇到问题。

我研究了很多,我看到了一些类似的主题,比如:

Android:java.lang.SecurityException:权限拒绝:启动意图 https://discuss.appium.io/t/error-a-new-session-could-not-be-created-for-android-appium/2571

当我输入./adb shell am start com.companyname.appname/com.companyname.appname.activities.MainActivity我收到以下消息:

Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.companyname.appname/.activities.MainActivity }
java.lang.SecurityException: Permission Denial: starting Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.companyname.appname/.activities.MainActivity } from null (pid=13786, uid=2000) not exported from uid 10101
    at android.os.Parcel.readException(Parcel.java:1465)
    at android.os.Parcel.readException(Parcel.java:1419)
    at android.app.ActivityManagerProxy.startActivityAsUser(ActivityManagerNative.java:2133)
    at com.android.commands.am.Am.runStart(Am.java:680)
    at com.android.commands.am.Am.onRun(Am.java:270)
    at com.android.internal.os.BaseCommand.run(BaseCommand.java:47)
    at com.android.commands.am.Am.main(Am.java:76)
    at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
    at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:243)
    at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

当我尝试使用 Appium 运行该应用程序时,它会抛出以下内容:

[31mMessage: [0m[31morg.openqa.selenium.SessionNotCreatedException: A new session could not be created. (Original error: Permission to start activity …
Run Code Online (Sandbox Code Playgroud)

android manifest adb appium

2
推荐指数
1
解决办法
1万
查看次数