小编lib*_*bik的帖子

REST API - 文件(即图像)处理 - 最佳实践

我们正在使用REST API开发服务器,它接受并使用JSON进行响应.问题是,如果您需要将图像从客户端上传到服务器.

另请注意,我在讨论用例,其中实体(用户)可以拥有文件(carPhoto,licensePhoto),还有其他属性(名称,电子邮件...),但是当您创建新用户时,您不会发送这些图像,它们是在注册过程后添加的.


我所知道的解决方案,但每个都有一些缺陷

1.使用multipart/form-data而不是JSON

:POST和PUT请求尽可能是RESTful,它们可以包含文本输入和文件.

缺点:它不再是JSON,与multipart/form-data相比,它更容易测试,调试等

2.允许更新单独的文件

用于创建新用户的POST请求不允许添加图像(在我们的用例中我在开始时的说法是可以的),上传图片是通过PUT请求作为multipart/form-data完成的,例如/ users/4/carPhoto

好的:一切(除了文件上传本身)都保留在JSON中,它很容易测试和调试(你可以记录完整的JSON请求而不用担心它们的长度)

缺点:它不直观,您不能一次POST或PUT实体的所有变量,并且此地址/users/4/carPhoto可以更多地被视为一个集合(REST API的标准用例看起来像这样/users/4/shipments).通常你不能(也不想)GET/PUT实体的每个变量,例如users/4/name.您可以使用GET获取名称,并在用户/ 4处使用PUT进行更改.如果在id之后有什么东西,它通常是另一个集合,比如users/4/reviews

3.使用Base64

将其作为JSON发送,但使用Base64编码文件.

good:与第一个解决方案相同,它尽可能地提供RESTful服务.

缺点:再次,测试和调试更糟糕(正文可以有兆字节数据),大小和处理时间都有所增加 - 客户端和服务器


我真的很想使用解决方案.2,但它有它的缺点...任何人都可以让我更好地了解"什么是最好的"解决方案?

我的目标是使用尽可能多的标准来提供RESTful服务,同时我希望尽可能简化它.

rest json file-upload restful-architecture

140
推荐指数
4
解决办法
9万
查看次数

java.lang.ClassCastException:com.sun.net.ssl.internal.www.protocol.https.HttpsURLConnectionOldImpl无法强制转换为javax.net.ssl.HttpsURLConnection

我在我的Netbeans 7.4中尝试了这个代码,它没有问题

import java.io.IOException;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;

public class JavaApplication148 {
    public static void main(String[] args) throws IOException {
        URL url = new URL("https://redmine.ackee.cz/time_entries.xml");
        HttpsURLConnection httpCon = (HttpsURLConnection) url.openConnection();
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,我在我的maven驱动的项目中使用它在eclipse中它抛出以下异常:

java.lang.ClassCastException: com.sun.net.ssl.internal.www.protocol.https.HttpsURLConnectionOldImpl 
cannot be cast to javax.net.ssl.HttpsURLConnection
Run Code Online (Sandbox Code Playgroud)

这是我的maven项目中的一个抛出错误的类

package cz.ackee.redmine.commands;

import java.io.IOException;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;

public abstract class RedmineCommand {      
    public void write(String xmlAddress, String text, String requestMethod) throws IOException{         
         URL url = new URL("https://redmine.xxx.cz/time_entries.xml");
         HttpsURLConnection httpCon = (HttpsURLConnection) url.openConnection(); //this line throws exception
    }       
} …
Run Code Online (Sandbox Code Playgroud)

java eclipse netbeans maven classnotfoundexception

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

Google Cloud Platform - 多行日志记录

我们正在使用 Node.js 服务器并在 Google Cloud Platform 上有日志。

问题是,如果我们做一个日志条目并将对象放入其中,该对象被序列化为多行输出,则它不是“堆叠”的。

因此,如果我们有 100 行的对象,它会在 google 中创建 100 行输出,这真的很难阅读,我们无法对其进行“分组”。

在其他服务中,输出总是堆叠的(loggly、logsene)。

你知道如何堆叠输入吗?我们正在使用 Winston 进行日志记录(将控制台作为输出之一)

javascript logging node.js google-cloud-platform

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

AWS RDS MariaDB 在简单的更改表上无缘无故地消耗了 300GB

我们在 r5.large 实例上的 AWS RDS 中有 MariaDB。我们有 4 个实例,每个实例使用了大约 350GB 的存储空间。每个实例有近 2000 个不同的数据库,迁移尝试在所有数据库上运行,但算法会一一执行迁移。

我们正在修改的表实际上很小——每个数据库通常有数百行。

出于某种奇怪的原因,当我们运行此迁移时,AWS RDS MariaDB 消耗了我们拥有的所有存储,因为我们已自动扩展存储,它的值从 350GB 跃升至约 650GB,但仍然不够。此外,如此庞大的数据消耗非常快(基于监控1-2分钟)。然后它就停止了,因为 AWS 拒绝如此迅速地给我们更多的空间,而且没有剩余的存储空间。

它发生在所有 4 个实例上。

这是我们使用的alter表

ALTER TABLE `item_place`
    ADD COLUMN IF NOT EXISTS `deleted_at` datetime NULL,
    ALGORITHM=NOCOPY, LOCK=NONE;

ALTER TABLE `item_place`
    ADD INDEX IF NOT EXISTS `deleted_at` (`deleted_at`),
    ALGORITHM=NOCOPY, LOCK=NONE;
Run Code Online (Sandbox Code Playgroud)

我们没有看到任何异常。此外,我们有具有相同迁移的 TEST 数据库,但那里什么也没发生。虽然它们要小得多(5GB),但是当在那里执行迁移时,我们没有看到存储空间的小幅下降。

我们在日志中没有发现任何特别之处。

database alter-table amazon-web-services mariadb devops

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

MyBatis加载XML:java.io.IOException:找不到资源(eclipse)

我在Eclipse中使用MyBatis时发现了奇怪的行为.

我在找到我的xml时遇到MyBatis的困难,所以我尝试使用绝对路径(仅用于测试目的)并且它仍然会抛出错误:

为了确保该文件存在,我在将其用作资源之前添加了对文件存在的检查,因此我确信该文件存在:

        String resource = "e:/prace/workspace/SpringBatis/src/main/java/com/mkyong/MyBatis/xml/batisConfig.xml";// path of the mybatis configuration file.
        File file = new File(resource);
        System.out.println(file.exists());
        Reader reader = Resources.getResourceAsReader(resource);// read the mybatis confiuguration xml file 
Run Code Online (Sandbox Code Playgroud)

有这个输出:

true
java.io.IOException: Could not find resource e:/prace/workspace/SpringBatis/src/main/java/com/mkyong/MyBatis/xml/batisConfig.xml
    at org.apache.ibatis.io.Resources.getResourceAsStream(Resources.java:89)
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

java eclipse mybatis

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

将定义添加到Typescript中的现有模块

我正在努力处理Typescript并修改现有模块的定义。

我们习惯将要输出的任何内容都放入“ res.out”,最后有类似“ res.json(res.out)”的内容。这使我们能够在发送响应时对应用程序进行一般控制。

所以我有这样的功能

export async function register(req: Request, res: Response, next: Next) {
    try {
        const user = await userService.registerOrdinaryUser(req.body)
        res.status(201);
        res.out = user;
        return helper.resSend(req, res, next);
    } catch (ex) {
        return helper.resError(ex, req, res, next);
    }
};
Run Code Online (Sandbox Code Playgroud)

我们正在使用restify。而且我收到编译错误,因为“输出”不是restify.Response的一部分。

现在,我们有了解决方法,即拥有“自己的”对象,该对象扩展了Restify对象。

import {
    Server as iServer,
    Request as iRequest,
    Response as iResponse,
} from 'restify'

export interface Server extends iServer {
}

export interface Request extends iRequest {
}

export interface Response extends iResponse {
    out?: any;
} …
Run Code Online (Sandbox Code Playgroud)

javascript node.js node-modules typescript

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

Java中2d int数组优化的洪水填充

我正在编写自己的 Flood Fill 实现。

我想出了这个代码:

  public static void fillArea(int x, int y, int original, int fill, int[][] arr) {
        Stack<int[]> q = new Stack<int[]>();
        int[] w = new int[2]; //to the west
        int[] e = new int[2]; //to the east

        if (arr[x][y] != original) {
            return;
        }

        q.push(new int[]{x, y});

        while (!q.isEmpty()) {
            int[] pos = (int[]) q.pop();
            int i = pos[0];
            int j = pos[1];
            if (arr[i][j] == original) {
                e[0] = i;
                e[1] = j;
                w[0] = i; …
Run Code Online (Sandbox Code Playgroud)

java algorithm path-finding flood-fill

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

Google IAP 订阅

我刚刚读过这个:Google Play Developer API:“startTimeMillis”在不应该更新的时候被更新

但它比较旧。有人可以确认它是这样工作的吗?

当前的问题是,在我们的其他支付方式系统中,我们创建了自己的订阅。当此订阅结束时,我们将取消订阅,并且不再允许用户使用。如果用户稍后重新订阅,则对我们来说是新订阅。

但是,如果用户重新订阅,我们会得到新的purchaseToken,这部分就可以正常工作。但旧的订阅应该保持未付状态。但是,如果用户订阅并且旧令牌再次激活并且两个不同的令牌将返回相同的结果,这是一种问题。

我们将使用此端点: https: //developers.google.com/android-publisher/api-ref/purchases/subscriptions/get应该有以下结果: https: //developers.google.com/android-publisher /api-ref/purchases/subscriptions#resource

我们能否以某种方式发现旧令牌已被取消,然后重新订阅,并且我们应该期待新的订阅?

android in-app-purchase in-app-billing google-play google-play-services

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

DynamoDB全局表复制延迟

我想使用DynamoDB全局表,复制数据之前的典型/平均延迟是多少?

database amazon-web-services nosql amazon-dynamodb

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

Winston 日志记录 - Winston 3.x 中漂亮的 JSON 格式

几年前我和温斯顿一起工作。当我们在 localhost 上开发时,我们的 winston 被配置为输出格式良好、易于阅读的 JSON。

2.x 温斯顿

npm install winston@2.2.0

const winston = require('winston');
const logger = new winston.Logger({
    transports: [new (winston.transports.Console)({ json: true })],
});

logger.info('please', { iam: 'good' });
try {
    throw new Error('ooh noo');
} catch (err) {
    logger.error('Not good error', err);
}
Run Code Online (Sandbox Code Playgroud)

有这个输出

{
  "iam": "good",
  "level": "info",
  "message": "please"
}
{
  "message": "Not good error",
  "stack": "Error: ooh noo\n    at Object.<anonymous> (C:\\Users\\libor\\WebstormProjects\\untitled\\usewinston.js:30:11)\n    at Module._compile (internal/modules/cjs/loader.js:1063:30)\n    at Object.Module._extensions..js (internal/
modules/cjs/loader.js:1092:10)\n    at Module.load (internal/modules/cjs/loader.js:928:32)\n    at Function.Module._load …
Run Code Online (Sandbox Code Playgroud)

javascript logging node.js winston console.log

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

迭代器(array.each)作为ruby中方法的返回值

我有这门课:

class MyArray
  attr_accessor :data

  def initialize(my_object = nil)
    @data = Array[*my_object]
  end

  def <<(y)
    @data << y
  end

  def each
    @data.each
  end
end
Run Code Online (Sandbox Code Playgroud)

我是这样使用它的

subject = MyArray.new([2, 5, 3])
  d = []   
  subject.each { |i|
    d << i
  }
Run Code Online (Sandbox Code Playgroud)

问题是,它甚至不会通过 -subject.each- 迭代一次。我应该怎么做才能从数组中返回“每个”值作为方法返回值?如何返回迭代器本身?

我试过这个,但它也不起作用:

  def each
    [2,5,3].each
  end
Run Code Online (Sandbox Code Playgroud)

感谢“meagar”和“Erik Allik”,我们有了正确的答案:(只有“def each”方法发生了变化)

class MyArray
  attr_accessor :data

  def initialize(my_object = nil)
    @data = Array[*my_object]
  end

  def <<(y)
    @data << y
  end

  def each(&block)
    @data.each(&block)
  end
end
Run Code Online (Sandbox Code Playgroud)

ruby

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

Docker node.js-alpine 不缓存 DNS 结果

我们尝试对我们的(dockerized 并部署到 AWS ECS)Node.js 应用程序进行负载测试,指标显示我们的容器中的 CPU 和内存非常好,但是 DNS 解析在更大的负载(每秒约 600 个请求,我们需要达到30000左右)

这是错误(我们正在使用 http-proxy 模块,但这应该超出它的范围):

// I have renamed the URL to xxx.com
"err": {
    "code": "EAI_AGAIN",
    "errno": "EAI_AGAIN",
    "syscall": "getaddrinfo",
    "hostname": "xxx.com",
    "host": "xxx.com",
    "port": 80,
    "statusCode": 500,
    "stack": "Error: getaddrinfo EAI_AGAIN xxx.com:80\n    at Object._errnoException (util.js:1024:11)\n    at errnoException (dns.js:55:15)\n    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:92:26)"
},
Run Code Online (Sandbox Code Playgroud)

我在想 DNS 会被操作系统自动缓存几分钟,但这并没有发生。

我们正在使用官方 Node.js docker 镜像 8.9.4-alpine

dns networking amazon-web-services node.js docker

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

最后得到错误}也是其他的事情

得到一个错误说我需要另一个while语句,我已经多次检查过}但是idk有什么问题
如果用户输入"y"我怎么也重新运行程序
谢谢

import java.util.Scanner;

public class Charles_Peppers_Prog6 {

    public static void main(String[] args)
    {
        Scanner user = new Scanner(System.in);

        // display the welcome / instructions
        System.out.println();
        System.out.println();
        System.out.println("     Welcome to Computer Dice");
        System.out.println("----------------------------------------------");
        System.out.println("You will be playing dice against the computer");
        System.out.println();
        System.out.println("you can only win with a Pair or a Straight");
        System.out.println("any Pair beats any Straight");
        System.out.println("any Pair beats any Junker");
        System.out.println("any Straight beats any Junker");
        System.out.println("in case of two Pairs - high Pair wins");
        System.out.println("in case of …
Run Code Online (Sandbox Code Playgroud)

java

-5
推荐指数
1
解决办法
63
查看次数